﻿// Inner Fire 游戏引擎库
// RootMotion - RootMotion计算器
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 用于保存每一帧应该用的RootMotion，混合计算等等。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-06-10

#pragma once

#include <graphics/graphics_def.h>

namespace ifire::game {
class Snapshot;

class RootMotion {
public:
  RootMotion(Snapshot* parent);
  RootMotion(const RootMotion& lhs) = delete;
  RootMotion& operator=(const RootMotion& lhs) = delete;
  ~RootMotion() = default;
  
  // 计算RootMotion
  void Execute(float frame, IMat& mat);

  // 重置RootMotion，如果动作被切换，则对比上一帧是没有意义的
  void Reset();

  // 属性访问
  inline IVec GetDelta() const { return delta_; }  
  inline void SetDelta(IVec vec) { delta_ = vec; }
  inline void SetRootMotionAxis(IAxis value) { root_motion_axis_ = value; }

private:  
  // 计算RootMotion的Delta
  void SetDelta(float frame, IVec translate);
  // 需要取哪个轴
  IAxis root_motion_axis_;
  // 上一次记录的RootMotion变量
  IVec last_;
  // 上一次记录的RootMotionFrame
  float last_frame_;
  // 当前的Delta
  IVec delta_;
  // 此项目的父级
  Snapshot* parent_;
};
} // namespace ifire::game